#ifndef __CPPTUTORTYPECASTING_H_
#define __CPPTUTORTYPECASTING_H_

#include <iostream>

#include "cppTutorGlobals.h"

#include "cppTutorLog.h"
extern CcppTutorLog Log;

using namespace std;

class CStandalone
{
	private:
		int m_nStandalone;
	public:
		CStandalone () : m_nStandalone (0) {
		}
	    virtual ~CStandalone () {
		}
		void m_Test () {
			std :: cout << "CStandalone :: m_Test ()" << endl;
		}
};

class CBase
{
    private:
    	int m_nBase;
	public:
        CBase ();
        virtual ~CBase ();
        virtual void m_Test ();
};

#ifdef STATIC_CAST
class CDerived : public CBase
#else
class CDerived : virtual public CBase
#endif
{
	private:
		int m_nDerived;
	public:
        CDerived ();
        virtual ~CDerived ();
        virtual void m_Test ();
};

#ifdef STATIC_CAST
class CcppTutorTypeCasting : public CBase, public CDerived
#else
class CcppTutorTypeCasting : virtual public CBase, virtual public CDerived
#endif
{
    public:
	    CcppTutorTypeCasting ();
        virtual ~CcppTutorTypeCasting ();

        void m_StaticCast ();
        void m_ConstCast ();
        void m_DynamicCast ();

        void func(int) {}
};

#endif // __CPPTUTORTYPECASTING_H_